#ifndef ChivoxCfg_hpp
#define ChivoxCfg_hpp

#include <stdio.h>
#include "cJSON.h"


#define CHIVOX_BEGIN_CFG(cfg) ChivoxCfg *cfg = ChivoxCfg::create(); cfg
#define CHIVOX_BEGIN_DICT(name) ->BeginDict(name)
#define CHIVOX_BEGIN_ARR(name) ->BeginArr(name)
#define CHIVOX_ADD_V(value) ->V(value)
#define CHIVOX_ADD_KV(key, value) ->KV(key, value)
#define CHIXO_END_DICT() ->End(name)
#define CHIVOX_END_ARR() ->End(name)
#define CHIVOX_END_CFG() ;

class ChivoxCfg {
public:
    ChivoxCfg();
    ~ChivoxCfg();
    
    static ChivoxCfg *create();
    
    ChivoxCfg *BeginDict(const char *key=NULL); // 
    ChivoxCfg *BeginArr(const char *key=NULL);
    ChivoxCfg *End(const char *tag=NULL);

    ChivoxCfg *kvBool(const char *key, bool value);
    ChivoxCfg *kvNumber(const char *key, double value);
    ChivoxCfg *kvString(const char *key, const char *value);
    ChivoxCfg *vBool(bool value);  // vBool
    ChivoxCfg *vNumber(double value); // vNumber
    ChivoxCfg *vString(const char *value); // vString

    // 便捷方法
    ChivoxCfg *D(const char *key=NULL) {return this->BeginDict(key);}
    ChivoxCfg *_D(const char *tag=NULL) {return this->End(tag);}
    ChivoxCfg *A(const char *key=NULL) {return this->BeginArr(key);}
    ChivoxCfg *_A(const char *tag=NULL) {return this->End(tag);}

    ChivoxCfg *V(bool value) {return this->vBool(value);}  
    ChivoxCfg *V(int value) {return this->vNumber(value);} 
    ChivoxCfg *V(double value) {return this->vNumber(value);} 
    ChivoxCfg *V(const char *value) {return this->vString(value);} 
    ChivoxCfg *KV(const char *key, bool value) {return this->kvBool(key, value);} 
    ChivoxCfg *KV(const char *key, int value) {return this->kvNumber(key, value);} 
    ChivoxCfg *KV(const char *key, double value) {return this->kvNumber(key, value);} 
    ChivoxCfg *KV(const char *key, const char *value) {return this->kvString(key, value);} 
    // end
    
    char *buildJsonString();
    char *buildFormatJsonString();
    
protected:
    ChivoxCfg *_parent;
    cJSON *_json;
};

#endif /* ChivoxCfg_hpp */
